perm filename DTLSER.MID[DLN,MRC] blob sn#529461 filedate 1980-08-10 generic text, type C, neo UTF8
COMMENT āŠ—   VALID 00005 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	TITLE DTLSER
C00004 00003	CORBEG RPCBLK WINDOW TTYLIN PTIBUF DLIBUF DLOBUF COREND ECHOFF TYSBLK IMPSET LINCON LINCOF GAGOFF NTYSTS TERMID
C00006 00004	DTLSER
C00008 00005	LOOP DLILP0 DLILUP PTILP0 PTILUP DLNSND DLNFRC
C00010 ENDMK
CāŠ—;
TITLE DTLSER
SUBTTL Definitions

; Mark Crispin, SU-AI, August '80

; Dialnet TELNET server

; Assembly switches

IFNDEF DLIBSZ,DLIBSZ==40.	; DLN input buffer size
IFNDEF DLOBSZ,DLOBSZ==256.	; DLN output buffer size

; AC definitions

A=1 ? B=2 ? C=3 ? D=4

; System definitions

INTPTO==001000,,		; PTY interrupt
INTCLK==000200,,		; clock interrupts
INTIMS==000020,,		; DLN status change
INTINP==000010,,		; DLN input
IO%CLS==000200			; connection closing
IO%EOF==000400			; end of file
ECHARR==010000,,		; echo controls with uparrow
FCS==   000020,,		; full character set
TBXPND==000010,,		; software tabs
FULTWX==000004,,		; no echo
XON==   000002,,		; paper tape mode

; Macros

DEFINE FATAL TEXT
 JRST [	OUTSTR [ASCIZ\!TEXT
\]
	EXIT 1,
	JRST .-1]
TERMIN
;CORBEG RPCBLK WINDOW TTYLIN PTIBUF DLIBUF DLOBUF COREND ECHOFF TYSBLK IMPSET LINCON LINCOF GAGOFF NTYSTS TERMID

SUBTTL Data area

CORBEG==.			; first loc zeroed at init time

RPCBLK:	0			; RPC command block
	BLOCK 2			; no PID
WINDOW:	BLOCK 1			; window size
	BLOCK 1			; no phone number

TTYLIN:	BLOCK 1			; remember PTY line number here
PTIBUF:	BLOCK 30.		; PTY input buffer
DLIBUF:	BLOCK DLIBSZ/4		; DLN input buffer
DLOBUF:	BLOCK DLOBSZ/4		; DLN output buffer

COREND==.-1

ECHOFF:	001400,,(FULTWX)	; echo off

TYSBLK==.			; TTYSET command block
IMPSET:	034400,,		; IMP TTY
LINCON:	001400,,(ECHARR\FCS\TBXPND) ; default line chars
LINCOF:	002400,,(XON\FULTWX)
GAGOFF:	024400,,		; gag off
NTYSTS==.-TYSBLK

TERMID:	'TERMID			; terminal ID for FINGER
	ASCIZ/Dialnet/
;DTLSER

SUBTTL Start of program

DTLSER:	CAI
	RESET			; flush all I/O
	MOVE B,17		; DLNLGR passes device name in AC 17
	GETPPN A,
	CAME A,['NETSYS]
	 MOVE B,[SIXBIT/DLN2/]
	MOVEI A,417		; dump mode
	SETZ C,			; no buffers
	OPEN A			; seize the port
	 FATAL Port OPEN failed
	SETSTS 17		; clear no-wait bit
	MOVEI A,5		; system maximum buffer size
	MOVEM A,WINDOW
	MTAPE RPCBLK		; accept the RPC
	 FATAL Accept RPC failed
	MTAPE [7]		; wait for connection
	 FATAL Connection wait failed
	PTYGET A		; snarf a PTY
	 FATAL Unable to get any PTY
	HRRZM A,TTYLIN
	MOVSI (A)		; set up TTYSET command words
	IRPS FOO,,ECHOFF IMPSET LINCON LINCOF GAGOFF
	 IORM FOO
	TERMIN
	MOVEI TERMID
	MOVEM JOBVER
	HRROI ECHOFF
	TTYSET
	MOVEI B,[ASCIZ/Hello
/]
	PTWRS7 A
	MOVE [-NTYSTS,,TYSBLK]	; set up initial TTY status
	TTYSET
	LOCK
	MOVEI [DISMIS]		; set up interrupt server
	MOVEM JOBAPR
	CLKINT 2*60.
	MOVSI (INTPTO\INTIMS\INTINP\INTCLK)
	INTENB			; enable interrupts

; falls through
;LOOP DLILP0 DLILUP PTILP0 PTILUP DLNSND DLNFRC

SUBTTL Main program

; drops in

LOOP:	IWAIT			; wait for an interrupt to happen
DLILP0:	DMOVE A,[441140,,DLIBUF ? DLIBSZ]
	SETZ C,
	INPUT A
	JUMPN C,[OUTSTR [ASCIZ/User used non-zero channel
/]
		 JRST 4,.+1]
	MOVE A,[441100,,DLIBUF]
	SUBI B,DLIBSZ		; B ← - # of characters in buffer
	JUMPE B,PTILP0		; no input characters
	MOVE C,TTYLIN
DLILUP:	ILDB D,A
	PTWR1W C
	AOJL B,DLILUP
	JRST DLILP0

PTILP0:	STATZ IO%EOF		; that it?
	 EXIT
	DMOVE C,[441100,,DLOBUF ? DLOBSZ]
	MOVE A,TTYLIN		; read buffer from PTY
	MOVE B,[441140,,PTIBUF]
	PTRDS A
PTILUP:	ILDB B
	JUMPE DLNSND		; buffer empty
	ANDI 377
	IDPB C
	SOJG D,PTILUP
DLNSND:	DMOVE A,[441100,,DLOBUF ? DLOBSZ]
	SUBI B,(D)		; subtract unused characters in buffer
	JUMPE B,DLNFRC		; no bytes to do
	SETZ C,			; channel 0
	OUTPUT A		; send the buffer
	JRST PTILP0
DLNFRC:	MTAPE [5]		; force buffer out
	JRST LOOP

END DTLSER